/**
 * 
 * @param target 1.对于实例访问器来说值是【所属类的原型对象】 2.对于静态访问器来说值是【所属类】
 * @param propertyKey 访问器名称
 * @param descriptor 描述对象
 */
function Demo(target: object, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log(target)
    console.log(propertyKey)
    console.log(descriptor)
    console.log('-----------------------------------')
}


class Person {
    @Demo
    get address() {
        return '北京宏福科技园'
    }
    @Demo
    static get country() {
        return '中国'
    }
}



/**
 * 应用举例
 * 
 */
function RangeValidate(min: number, max: number) {
    return function (target: object, propertyKey: string, descriptor: PropertyDescriptor) {
        // 保存原始的setter
        const originnalSetter = descriptor.set
        // 重写setter
        descriptor.set = function (value:number) {
            // 检查设置的值是否在指定的最大最小值之间
            if(value < min || value > max ){
                // 如果值不在范围内，抛出错误
                throw new Error(`${propertyKey}的值应该在${min}到${max}之间!`)
            }
            // 如果值在范围内，且原始setter方法存在，则调用原始setter方法
            if(originnalSetter){
                originnalSetter.call(this,value)
            }
        }
    }
}

class Weather {
    private _temp: number
    constructor(_temp: number) {
        this._temp = _temp
    }
    @RangeValidate(-50, 50)
    set temp(value) {
        this._temp = value
    }
    get temp() {
        return this._temp
    }
}

const w1 = new Weather(25)
console.log(w1.temp)
w1.temp = 9000
console.log(w1.temp)

